'use strict';

const Controller = require('egg').Controller;

class ShareController extends Controller {
	async save() {
		const { ctx, app, service } = this;
		let current_user_id = ctx.authUser.id;

		ctx.validate({
			dir_id: {
				type: 'int',
				required: true,
				desc: '目录ID'
			},
			sharedurl: {
				type: 'string',
				required: true,
				desc: '分享标识'
			}
		});

		let { dir_id, sharedurl } = ctx.request.body;

		// 分享是存在
		let s = await service.share.isExist(sharedurl, {
			include: [
				{
					model: app.model.File
				}
			]
		});
		// 是否本人分享
		if (s.user_id === current_user_id) {
			return ctx.Fail('本人分享,无需重复保存!');
		}

		// 文件是否存在
		if (dir_id > 0) {
			await service.file.isDirExist(dir_id);
		}

		// 查询该分享目录下所有数据
		const getAllFile = async (obj, dirId) => {
			let data = {
				name: obj.name,
				ext: obj.ext,
				md: obj.md,
				file_id: dirId,
				user_id: current_user_id,
				size: obj.size,
				isdir: obj.isdir,
				url: obj.url
			};

			// 判断当前用户剩余空间
			if (ctx.authUser.total_size - ctx.authUser.used_size < data.size) {
				return ctx.throw(400, '剩余空间不足!');
			}

			// 直接创建
			let o = await app.model.File.create(data);
			// 更新用户使用内存

			ctx.authUser.used_size += parseInt(data.size);
			await ctx.authUser.save();

			// 如果是目录，继续递归
			if (obj.isdir) {
				let rows = await app.model.File.findAll({
					where: {
						user_id: obj.user_id,
						file_id: obj.id
					}
				});
				rows.forEach(item => {
					getAllFile(item, o.id);
				});

				return;
			}
		};

		await getAllFile(s.file, dir_id);
		ctx.Success('保存成功');
	}
	async read() {
		const { ctx, app, service } = this;
		const sharedurl = ctx.params.sharedurl;
		if (!sharedurl) {
			return ctx.throw(404, '非法参数!');
		}

		let file_id = ctx.query.file_id;
		let s = await service.share.isExist(sharedurl);
		let where = {
			user_id: s.user_id
		};
		// 分享是否存在
		if (!file_id) {
			where.id = s.file_id;
		} else {
			where.file_id = file_id;
		}
		let rows = await app.model.File.findAll({
			where,
			order: [['isdir', 'desc']]
		});

		ctx.Success(rows);
	}
	async list() {
		const { ctx, app } = this;
		const user_id = ctx.authUser.id;

		let list = await app.model.Share.findAndCountAll({
			where: {
				user_id
			},
			include: [
				{
					model: app.model.File
				}
			]
		});

		ctx.Success(list);
	}
	async create() {
		const { ctx, app, service } = this;
		const user_id = ctx.authUser.id;

		ctx.validate({
			file_id: { type: 'int', required: true, desc: '文件ID' }
		});

		let { file_id } = ctx.request.body;

		// 文件/文件夹是否存在
		let f = await app.model.File.findOne({
			where: {
				id: file_id,
				user_id
			}
		});

		if (!f) {
			return ctx.throw(400, '文件不存在');
		}
		// 唯一ID
		let sharedurl = ctx.genID(15);
		// 创建分享
		let s = await app.model.Share.create({
			sharedurl,
			file_id,
			iscancel: 0,
			user_id
		});

		let url = app.config.serUrl + 'sharepage/' + sharedurl;
		ctx.Success('分享链接:' + url);
	}
	// 分享重定向
	async readpage() {
		const { ctx, app } = this;
		const sharedurl = ctx.params.shareurl;
		if (!sharedurl) {
			return ctx.Fail('非法参数');
		}
		if (ctx.ismobile()) {
			return ctx.redirect(
				app.config.appUrl + '#/pages/shareurl/shareurl?key=' + sharedurl
			);
		}
		ctx.redirect(app.config.webUrl + 'shareurl?key=' + sharedurl);
	}
}

module.exports = ShareController;
